﻿/****************************************************************************
** file: bayer2rgb.h
** brief: 提供了 BAYER 格式的图像数据与 RGB 格式的图像数据的相互转换功能。
** 只实现了一种转换为 RGB32 的方法。
** 实现了 4 种转换为 RGB24 的方法。
** Copyright (C) LiYuan
** Author: LiYuan
** E-Mail: 18069211#qq(.)com
** Version 1.0.0
** Last modified: 2019.01.11
** Modified By: LiYuan
** TODO: 转换为 RGB32 的方法还需要完善，现在只实现了最临近算法。
****************************************************************************/

#ifndef BAYER2RGB_H
#define BAYER2RGB_H

#include <stdint.h>

enum BAYER_PATTERN
{
  COLOR_FILTER_RGGB = 512,
  COLOR_FILTER_GBRG,
  COLOR_FILTER_GRBG,
  COLOR_FILTER_BGGR
};

enum
{
    BAYER_SUCCESS = 0,
    INVALID_BAYER_METHOD
};

/** Bayer conversion method
 */
enum BAYER_METHOD
{
    BAYER_METHOD_NONE         = -1,
    BAYER_METHOD_NEAREST      = 0,  // 2009-03-30: deprecated, mapped to BAYER_METHOD_SIMPLE
    BAYER_METHOD_SIMPLE       = 1,
    BAYER_METHOD_BILINEAR     = 2,  // 2009-03-30: deprecated, mapped to BAYER_METHOD_HQLINEAR
    BAYER_METHOD_HQLINEAR     = 3,
    BAYER_METHOD_EDGESENSE    = 4,  // 2009-03-30: deprecated, mapped to BAYER_METHOD_HQLINEAR
    BAYER_METHOD_DOWNSAMPLE   = 5,  // 2011-03-08: deprecated, user is sopposed to provide for own conversion
};

#define BAYER_METHOD_MIN      BAYER_METHOD_NEAREST
#define BAYER_METHOD_MAX      BAYER_METHOD_EDGESENSE
#define BAYER_METHOD_NUM     (BAYER_METHOD_MAX-BAYER_METHOD_MIN+1)

/**
 * @brief bayer_to_RGB32_NearestNeighbor Bayer 格式转换为 RGB32 格式。
 * @param bayer Bayer 格式数据
 * @param rgb32  #ARGB 格式排列(注意与 rgb24 格式的像素排列是相反的)
 * @param sx  width
 * @param sy  height
 * @param tile 哪种 Bayer 格式，RGGB，GBRG，GRBG，GBGR 之一
 */
void bayer_to_RGB32_NearestNeighbor(const uint8_t *bayer, uint32_t *rgb32, int sx, int sy, BAYER_PATTERN tile);


void bayer_to_RGB24_NearestNeighbor(const uint8_t *bayer, uint8_t *rgb24, int sx, int sy, BAYER_PATTERN tile);
void bayer_to_RGB24_Bilinear(const uint8_t *bayer, uint8_t *rgb24, int sx, int sy, BAYER_PATTERN tile);
void bayer_to_RGB24_HQLinear(const uint8_t *bayer, uint8_t *rgb24, int sx, int sy, BAYER_PATTERN tile);
void bayer_to_RGB24_EdgeSense(const uint8_t *bayer, uint8_t *rgb24, int sx, int sy, BAYER_PATTERN tile);
void bayer_to_RGB24_Downsample(const uint8_t *bayer, uint8_t *rgb24, int sx, int sy, BAYER_PATTERN tile);
void bayer_to_RGB24_Simple(const uint8_t *bayer, uint8_t *rgb24, int sx, int sy, BAYER_PATTERN tile);

/**
 * @brief bayer_to_RGB24_decoding_8bit Bayer 格式到 RGB 格式的转换代码
 * @param bayer
 * @param rgb24
 * @param sx
 * @param sy
 * @param tile 哪种 Bayer 格式，RGGB，GBRG，GRBG，GBGR 之一
 * @param method
 * @return
 */
int bayer_to_RGB24_decoding_8bit(const uint8_t *bayer, uint8_t *rgb24, int sx, int sy, BAYER_PATTERN tile, BAYER_METHOD method);


#endif // BAYER2RGB_H
